package com.dream.tihai.common.util;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

/**
 * @author Valley
 * Created by Valley on 2022/12/5
 */
public class FileUtils {

    public static void copy(File source, File targetDir) {
        if (source.isFile()) {
            copyFile(source, targetDir);
        }else {
            targetDir = new File(targetDir,source.getName());
            if (!targetDir.exists()) {
                targetDir.mkdirs();
            }
            File[] subFiles = source.listFiles();
            if (subFiles != null) {
                for (int i = 0; i < subFiles.length; i++) {
                    copy(subFiles[i], targetDir);
                }
            }
        }
    }

    /**
     * 复制文件
     * 文件拷贝部分完成，然后再判断源文件是否是标准文件，
     * 标准文件即非目录文件，如果源文件是标准文件，则直接拷贝(上面做好的方法)，
     * 源文件是目录的话，递归进入目录，重复执行创建目录行为。
     * @param sourceFile
     * @param targetDir
     */
    private static void copyFile(File sourceFile, File targetDir) {
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }
        File target = new File(targetDir, sourceFile.getName());
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(sourceFile);
            os = new FileOutputStream(target);
            byte[] b = new byte[1024];
            int len = 0;
            System.out.println("开始拷贝...");
            while ((len = is.read(b)) != -1) {
                os.write(b, 0, len);
            }
            System.out.println("拷贝完成...");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (Objects.nonNull(os)) {
                    os.close();
                }
                if (Objects.nonNull(is)) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 复制文件
     * 第一个参数为源文件，第二个参数为目的文件
     * @param sourceFile
     * @param target
     */
    public static void copyTargetFile(File sourceFile, File target) {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(sourceFile);
            os = new FileOutputStream(target);
            byte[] b = new byte[1024];
            int len = 0;
            System.out.println("开始拷贝...");
            while ((len = is.read(b)) != -1) {
                os.write(b, 0, len);
            }
            System.out.println("拷贝完成...");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (Objects.nonNull(os)) {
                    os.close();
                }
                if (Objects.nonNull(is)) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*** 下载文件到浏览器
     * @param request
     * @param response
     * @param filename 要下载的文件名
     * @param file     需要下载的文件对象
     *
     */
    public static void downFile(HttpServletRequest request, HttpServletResponse response, String filename, File file) throws IOException {
        //  文件存在才下载
        if (file.exists()) {
            OutputStream out = null;
            FileInputStream in = null;
            try {
                // 1.读取要下载的内容
                in = new FileInputStream(file);

                // 2. 告诉浏览器下载的方式以及一些设置
                // 解决文件名乱码问题，获取浏览器类型，转换对应文件名编码格式，IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
                String agent = request.getHeader("user-agent");
                if (agent.contains("FireFox")) {
                    filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
                } else {
                    filename = URLEncoder.encode(filename, "UTF-8");
                }
                // 设置下载文件的mineType，告诉浏览器下载文件类型
                String mineType = request.getServletContext().getMimeType(filename);
                response.setContentType(mineType);
                // 设置一个响应头，无论是否被浏览器解析，都下载
                response.setHeader("Content-disposition", "attachment; filename=" + filename);
                // 将要下载的文件内容通过输出流写到浏览器
                out = response.getOutputStream();
                int len = 0;
                byte[] buffer = new byte[1024];
                while ((len = in.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            }
        }

    }

    /**
     * 删除文件夹内所有文件
     * @param file
     */
    public static void delDir(File file){
        if(file.isFile()){
            boolean delete = file.delete();
            if(delete) {
                System.out.println(file.getAbsolutePath()+"：删除成功..");
            }else {
                System.out.println(file.getAbsolutePath()+"：删除失败..");
            }
        }
        else{
            for(File sonfile:file.listFiles()){
                delDir(sonfile);
            }
        }
        boolean delete1 = file.delete();
        if(delete1) {
            System.out.println(file.getAbsolutePath()+"：删除成功..");
        }else {
            System.out.println(file.getAbsolutePath()+"：删除失败..");
        }
    }

    /**
     * 获取当前时间
     */
    public static String getNow() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(new Date());
    }

    /**
     * @Title: encrypt_zip
     * @Description:将指定路径下的文件压缩至指定zip文件，并以指定密码加密,若密码为空，则不进行加密保护
     * 待压缩文件路径
     * zip路径+文件名
     * @param encode 加密密码
     * @return
     */
    public static void encryptFile(File source, String dest, String encode) {
        ZipParameters parameters = new ZipParameters();
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);//压缩方式
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别

        parameters.setEncryptFiles(true);
        parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);//加密方式
        parameters.setPassword(encode.toCharArray());//设置密码

        try {
            ZipFile zipFile = new ZipFile(dest);

            zipFile.setFileNameCharset("GBK");
            zipFile.addFile(source, parameters);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
